package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// User 数据模型定义
type User struct {
	gorm.Model
	Nickname string
	Gender   int
	Email    string `gorm:"index"`
}

func main() {
	//创建数据库连接
	dsn := "root:12345678@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}

	//开启debug模式,可以打印实际执行的SQL语句
	db = db.Debug()

	//自动迁移,即自动创建表结构
	//db.AutoMigrate(&User{})

	//插入操作
	//insert(db)

	//查询操作
	//get(db)

	//修改操作
	//update(db)

	//删除操作
	//delete(db)
}

// 插入操作
func insert(db *gorm.DB) {
	u := &User{
		Nickname: "zsa",
		Gender:   1,
		Email:    "zsa@qq.com",
	}
	db.Create(u)
}

// 查询操作
func get(db *gorm.DB) {
	//根据主键ID查询
	//SELECT * FROM `users` WHERE `users`.`id` = 1 LIMIT 1
	var u1 User
	db.First(&u1, 1) //根据主键查询,即where id = 1
	fmt.Printf("根据主键查询, u1 = %v+\n", u1)

	//根据字段条件查询
	//SELECT * FROM `users` WHERE email = 'zsa@qq.com' LIMIT 1
	var u2 User
	db.First(&u2, "email = ?", "zsa@qq.com") //根据条件查询,即where email = 'zsa@qq.com'
	fmt.Printf("根据条件查询, u2 = %v+\n", u2)
}

func update(db *gorm.DB) {
	var u User
	db.First(&u, 1)

	//根据主键修改,通过参数直接修改指定字段
	// UPDATE `users` SET `nickname`='zsa1',`updated_at`='2024-05-29 11:23:16.51' WHERE `id` = 1
	db.Model(&u).Update("nickname", "zsa1")

	//根据主键修改,通过map指定需要修改的字段
	// UPDATE `users` SET `email`='zsa1@qq.com',`nickname`='zsa',`updated_at`='2024-05-29 11:31:15.06' WHERE `id` = 1
	db.Model(&u).Updates(map[string]interface{}{"nickname": "zsa", "email": "zsa1@qq.com"})
}

// 删除操作
func delete(db *gorm.DB) {
	//根据主键删除,默认均为软删除
	db.Delete(&User{}, 1)
}
